package com.wei.czz.framework.common.controller;

import com.wei.czz.common.annotation.Auth;
import com.wei.czz.common.annotation.Resubmit;
import com.wei.czz.common.dto.common.NameValue;
import com.wei.czz.common.dto.common.sms.SmsTemplateDetailDto;
import com.wei.czz.common.dto.common.sms.SmsTemplateDto;
import com.wei.czz.common.dto.common.sms.SmsTemplatePageEnumDto;
import com.wei.czz.common.dto.common.sms.SmsTemplateStatDto;
import com.wei.czz.common.jsr303.group.OrderSearch;
import com.wei.czz.common.jsr303.group.Save;
import com.wei.czz.common.jsr303.group.Update;
import com.wei.czz.common.property.BatchProperty;
import com.wei.czz.common.tool.PageDto;
import com.wei.czz.common.tool.Result;
import com.wei.czz.common.vo.common.UpdateStatusVo;
import com.wei.czz.common.vo.common.sms.SmsTemplateFormVo;
import com.wei.czz.common.vo.common.sms.SmsTemplateStatVo;
import com.wei.czz.common.vo.common.sms.SmsTemplateVo;
import com.wei.czz.framework.common.manager.SmsTemplateManager;
import lombok.AllArgsConstructor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import java.util.Map;


/**
 * Created by IntelliJ IDEA.
 *
 * @author wyw
 * date: 2023-06-14 21:23:54
 * className: SmsTemplateController 短信模板接口类
 * version: 1.0
 * description:
 */
@RestController
@RequestMapping("/sms-template")
@AllArgsConstructor
public class SmsTemplateController {

    private static final Logger log = LoggerFactory.getLogger(SmsTemplateController.class);

    private final BatchProperty batchProperty;

    private final SmsTemplateManager smsTemplateManager;

    /**
     * 保存短信模板接口
     * <p>
     * 调用方：
     *  1、浏览器-后台-短信模板管理页面-短信模板新增/修改抽屉中调用
     * <p>
     * 此接口会校验是否重复提交
     * @param smsTemplateVo 参数对象
     */
    @Resubmit(spEL = "'saveSmsTemplate' + #userPo.userId", message = "保存短信模板")
    @PostMapping("/save")
    @Auth(permit = "sms:template:save")
    public Result<Object> saveSmsTemplate(@Validated(Save.class) @RequestBody SmsTemplateVo smsTemplateVo) {
        log.info("开始保存短信模板业务。{}", smsTemplateVo);

        smsTemplateManager.saveSmsTemplate(smsTemplateVo);

        log.info("保存短信模板业务结束");
        return Result.success();
    }

    /**
     * 分页获取短信模板接口
     * <p>
     * 调用方：
     *  1、浏览器-后台-短信模板管理页面调用
     * <p>
     * 此接口会校验是否重复提交
     * @param smsTemplateFormVo 参数对象
     * @return 短信模板分页数据
     */
    @Resubmit(message = "'getSmsTemplatePageList' + #userPo.userId + '-' + #smsTemplateFormVo")
    @PostMapping("/page/list")
    @Auth(permit = "sms:template:list")
    public Result<PageDto<SmsTemplateDto>> getSmsTemplatePageList(
            @Validated(OrderSearch.class) @RequestBody SmsTemplateFormVo smsTemplateFormVo) {
        log.info("开始分页查询短信模板业务。{}", smsTemplateFormVo);

        PageDto<SmsTemplateDto> pageDto = smsTemplateManager.getSmsTemplatePageList(smsTemplateFormVo);

        log.info("分页查询短信模板业务结束");
        return Result.success(pageDto);
    }

    /**
     * 获取短信模板页面枚举接口
     * <p>
     * 调用方：
     *  1、浏览器-后台-短信模板管理页面调用
     * @return 枚举数据
     */
    @GetMapping("/page/enum")
    @Auth(permit = "sms:template:list")
    public Result<SmsTemplatePageEnumDto> getSmsTemplatePageEnum() {
        log.info("开始获取短信模板页面枚举业务");

        SmsTemplatePageEnumDto smsTemplatePageEnumDto = smsTemplateManager.getSmsTemplatePageEnum();

        log.info("获取短信模板页面枚举业务结束");
        return Result.success(smsTemplatePageEnumDto);
    }

    /**
     * 获取短信模板接口
     * <p>
     * 调用方：
     *  1、浏览器-后台-短信模板管理页面-短信模板新增/修改抽屉中调用
     *  2、浏览器-后台-短信模板管理页面-短信模板查看抽屉中调用
     * @param id 主键
     * @return 短信模板数据
     */
    @GetMapping("/detail")
    @Auth(permit = "sms:template:get")
    public Result<SmsTemplateDetailDto> getSmsTemplateDetail(@RequestParam("id") Long id) {
        log.info("开始获取短信模板业务。id={}", id);

        SmsTemplateDetailDto smsTemplateDetailDto = smsTemplateManager.getSmsTemplateDetail(id);

        log.info("获取短信模板业务结束");
        return Result.success(smsTemplateDetailDto);
    }

    /**
     * 获取短信渠道参数接口
     * <p>
     * 调用方：
     *  1、浏览器-后台-短信模板管理页面-短信模板新增/修改抽屉中调用
     * @param channel 短信渠道
     * @return 短信渠道参数映射
     */
    @GetMapping("/get/channel-param")
    @Auth(permit = "sms:template:get")
    public Result<Map<String, NameValue<String>>> getChannelParam(@RequestParam(value = "id", required = false) Long id,
                                                                  @RequestParam("channel") Integer channel) {
        log.info("开始获取短信渠道参数业务。id={} channel={}", id, channel);

        Map<String, NameValue<String>> channelParamMap = smsTemplateManager.getChannelParam(id, channel);

        log.info("获取短信渠道参数业务结束");
        return Result.success(channelParamMap);
    }

    /**
     * 获取短信模板统计数据接口
     * <p>
     * 调用方：
     *  1、浏览器-后台-短信模板管理页面-短信模板统计查看抽屉中调用
     * @param smsTemplateStatVo 参数对象
     * @return 结果
     */
    @PostMapping("/stat")
    @Auth(permit = "sms:template:get")
    public Result<SmsTemplateStatDto> getSmsTemplateStat(@Validated @RequestBody SmsTemplateStatVo smsTemplateStatVo) {
        log.info("开始获取短信模板统计数据业务。{}", smsTemplateStatVo);

        SmsTemplateStatDto smsTemplateStatDto = smsTemplateManager.getSmsTemplateStat(smsTemplateStatVo);

        log.info("获取短信模板统计数据业务结束");
        return Result.success(smsTemplateStatDto);
    }

    /**
     * 修改短信模板接口
     * <p>
     * 调用方：
     *  1、浏览器-后台-短信模板管理页面-短信模板新增/修改抽屉中调用
     * <p>
     * 此接口会校验是否重复提交
     * @param smsTemplateVo 参数对象
     */
    @Resubmit(spEL = "'updateSmsTemplate' + #userPo.userId", message = "修改短信模板")
    @PostMapping("/update")
    @Auth(permit = "sms:template:update")
    public Result<Object> updateSmsTemplate(@Validated(Update.class) @RequestBody SmsTemplateVo smsTemplateVo) {
        log.info("开始修改短信模板业务。{}", smsTemplateVo);

        smsTemplateManager.updateSmsTemplate(smsTemplateVo);

        log.info("修改短信模板业务结束");
        return Result.success();
    }

    /**
     * 修改短信模板状态接口
     * <p>
     * 调用方：
     *  1、浏览器-后台-短信模板管理页面调用
     * <p>
     * 此接口会校验是否重复提交
     * @param updateStatusVo 参数对象
     */
    @Resubmit(spEL = "'updateSmsTemplateStatus' + #userPo.userId", message = "修改短信模板状态")
    @PostMapping("/update/status")
    @Auth(permit = "sms:template:update")
    public Result<Object> updateSmsTemplateStatus(@Validated @RequestBody UpdateStatusVo updateStatusVo) {
        log.info("开始修改短信模板状态业务。{}", updateStatusVo);

        List<Long> idList = updateStatusVo.getIdList();
        if (batchProperty.getMaxSize() < idList.size()) {
            log.warn("修改短信模板状态数量超限。batch.maxSize={} list.size={}", batchProperty.getMaxSize(), idList.size());
            return Result.clientFail("一次修改短信模板状态最多允许同时修改" + batchProperty.getMaxSize() + "个模板");
        }

        smsTemplateManager.updateSmsTemplateStatus(updateStatusVo);

        log.info("修改短信模板状态业务结束");
        return Result.success();
    }

    /**
     * 删除短信模板接口
     * <p>
     * 调用方：
     *  1、浏览器-后台-短信模板管理页面调用
     * <p>
     * 此接口会校验是否重复提交
     * @param idList 主键列表
     */
    @Resubmit(spEL = "'deleteSmsTemplate' + #userPo.userId", message = "删除短信模板")
    @DeleteMapping("/delete")
    @Auth(permit = "sms:template:delete")
    public Result<Object> deleteSmsTemplate(@RequestBody List<Long> idList) {
        log.info("开始删除短信模板业务。idList={}", idList);

        if (batchProperty.getMaxSize() < idList.size()) {
            log.info("删除短信模板数量超限");
            return Result.clientFail("一次删除短信模板最多允许同时删除" + batchProperty.getMaxSize() + "个模板");
        }

        smsTemplateManager.deleteSmsTemplate(idList);

        log.info("删除短信模板业务结束");
        return Result.success();
    }

}
